using System;
using System.ComponentModel.DataAnnotations;
using System.Text.Json.Serialization;
using TiaoTaoHelper.Wtm.Models;
using WalkingTec.Mvvm.Core;
using WalkingTec.Mvvm.Mvc.Binders;

namespace HengTong.Model.Db.System;

/// <summary>
/// 系统模板管理实体类
/// 用于管理各种文档模板，如在职证明、离职证明、实习证明、销售合同等
/// </summary>
/// <remarks>
/// 该类继承自BasePoco，包含了完整的模板信息，
/// 包括基本信息、模板内容、分类信息、使用权限和状态信息等
/// </remarks>
public class SysTemplate : BasePoco
{
    /// <summary>
    /// 获取或设置模板名称
    /// </summary>
    /// <value>模板的正式名称，不能为空，最大长度128字符</value>
    [Display(Name = "模板名称", Description = "模板的正式名称", GroupName = "基本信息")]
    [Required(ErrorMessage = "模板名称不能为空")]
    [MaxLength(128)]
    public string TemplateName { get; set; }

    /// <summary>
    /// 获取或设置模板编码
    /// </summary>
    /// <value>模板的唯一编码，用于系统内部识别，最大长度64字符</value>
    [Display(Name = "模板编码", Description = "模板的唯一编码", GroupName = "基本信息")]
    [MaxLength(64)]
    public string TemplateCode { get; set; }

    /// <summary>
    /// 获取或设置模板类型
    /// </summary>
    /// <value>模板的类型分类，使用TemplateTypeEnum枚举值</value>
    [Display(Name = "模板类型", Description = "模板的类型分类", GroupName = "基本信息")]
    [Required(ErrorMessage = "模板类型不能为空")]
    public TemplateTypeEnum TemplateType { get; set; }

    /// <summary>
    /// 获取或设置模板内容
    /// </summary>
    /// <value>模板的主要内容，支持HTML格式和变量占位符</value>
    [Display(Name = "模板内容", Description = "模板的主要内容，支持HTML格式", GroupName = "模板信息")]
    [Required(ErrorMessage = "模板内容不能为空")]
    [JsonConverter(typeof(JsonStringConverter))]
    public string TemplateContent { get; set; }
    
    /// <summary>
    /// 获取或设置模板状态
    /// </summary>
    /// <value>模板当前的使用状态，使用TemplateStatusEnum枚举值</value>
    [Display(Name = "模板状态", Description = "模板的当前状态", GroupName = "状态信息")]
    public TemplateStatusEnum Status { get; set; }

    /// <summary>
    /// 获取或设置模板版本
    /// </summary>
    /// <value>模板的版本号</value>
    [Display(Name = "模板版本", Description = "模板的版本号", GroupName = "版本信息")]
    public int Version { get; set; }
    
    /// <summary>
    /// 获取或设置备注信息
    /// </summary>
    /// <value>模板的其他备注信息，最大长度1000字符</value>
    [Display(Name = "备注信息", Description = "模板的备注信息", GroupName = "其他信息")]
    [StringLength(1000)]
    public string Remarks { get; set; }
}

/// <summary>
/// 模板类型枚举
/// 定义模板的不同类型分类
/// </summary>
public enum TemplateTypeEnum
{
    /// <summary>
    /// 在职证明 - 员工在职证明模板
    /// </summary>
    [Display(Name = "在职证明")]
    在职证明 = 1,

    /// <summary>
    /// 离职证明 - 员工离职证明模板
    /// </summary>
    [Display(Name = "离职证明")]
    离职证明 = 2,

    /// <summary>
    /// 实习证明 - 实习生实习证明模板
    /// </summary>
    [Display(Name = "实习证明")]
    实习证明 = 3,

    /// <summary>
    /// 销售合同 - 销售合同模板
    /// </summary>
    [Display(Name = "销售合同")]
    销售合同 = 4,

    /// <summary>
    /// 采购合同 - 采购合同模板
    /// </summary>
    [Display(Name = "采购合同")]
    采购合同 = 5,

    /// <summary>
    /// 劳动合同 - 劳动合同模板
    /// </summary>
    [Display(Name = "劳动合同")]
    劳动合同 = 6,

    /// <summary>
    /// 保密协议 - 保密协议模板
    /// </summary>
    [Display(Name = "保密协议")]
    保密协议 = 7,

    /// <summary>
    /// 入职通知 - 入职通知书模板
    /// </summary>
    [Display(Name = "入职通知")]
    入职通知 = 8,

    /// <summary>
    /// 转正通知 - 员工转正通知模板
    /// </summary>
    [Display(Name = "转正通知")]
    转正通知 = 9,

    /// <summary>
    /// 调薪通知 - 员工调薪通知模板
    /// </summary>
    [Display(Name = "调薪通知")]
    调薪通知 = 10,

    /// <summary>
    /// 请假条 - 请假申请模板
    /// </summary>
    [Display(Name = "请假条")]
    请假条 = 11,

    /// <summary>
    /// 报销单 - 费用报销单模板
    /// </summary>
    [Display(Name = "报销单")]
    报销单 = 12,

    /// <summary>
    /// 其他模板 - 其他类型模板
    /// </summary>
    [Display(Name = "其他模板")]
    其他模板 = 99
}

/// <summary>
/// 模板状态枚举
/// 定义模板的使用状态
/// </summary>
public enum TemplateStatusEnum
{
    /// <summary>
    /// 草稿状态 - 模板正在编辑中
    /// </summary>
    [Display(Name = "草稿")]
    草稿 = 0,

    /// <summary>
    /// 正常状态 - 可正常使用
    /// </summary>
    [Display(Name = "正常")]
    正常 = 1,

    /// <summary>
    /// 停用状态 - 暂时停止使用
    /// </summary>
    [Display(Name = "停用")]
    停用 = 2,

    /// <summary>
    /// 归档状态 - 已归档保存
    /// </summary>
    [Display(Name = "归档")]
    归档 = 3
}
